﻿using AutoMapper;
using B.S.Data.MES.API.Applications.AccountApplication.Command;
using B.S.Data.MES.API.Applications.BaseData.Command.BOMCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.ChanXIanCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.CheJianCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.CustomerCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.MaterialGroupCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.MaterialTypeCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.ProductMaterialCommand;
using B.S.Data.MES.API.Applications.BaseData.Command.ProductCommand;
using B.S.Data.MES.API.Applications.CangKu.Command;
using B.S.Data.MES.API.Dto.CangKuDTO;
using B.S.Data.MES.API.Dto.DtoAssignattributes;
using B.S.Data.MES.API.Dto.DTOProcess;
using B.S.Data.MES.API.Dto.GenerateIDto;
using B.S.Data.MES.API.Dto.LoginDTO;
using B.S.Domain.Accounts;
using B.S.Domain.BasicData.Factory_modeling.Production_line_management;
using B.S.Domain.BasicData.Factory_modeling.shop_management;
using B.S.Domain.BasicData.MaterialManagement.BOM;
using B.S.Domain.BasicData.MaterialManagement.Material_type;
using B.S.Domain.BasicData.MaterialManagement.MaterialGroups;
using B.S.Domain.BasicData.MaterialManagement.Product_material;
using B.S.Domain.BasicData.Skill_management;
using B.S.Domain.BasicData.SupplierManagement;
using B.S.Domain.CangKu;
using B.S.Domain.Generateplan;
using B.S.Domain.Process.AssignattributesOneModel;
using B.S.Domain.Process.ProcessmaintenanceModel;
using B.S.Domain.Process.ProcessrouteName;
using B.S.Domain.基础数据.不良信息维护;
using B.S.Domain.基础数据.客户管理;
using B.S.Domain.AICustomerService;
using B.S.Domain.Dto.AICustomerServiceDTO;
using B.S.Data.MES.API.Applications.BaseData.Command.SupplierCommand;

namespace B.S.Data.MES.API
{
    /// <summary>
    /// MES系统的AutoMapper映射配置类
    /// 该类继承自AutoMapper的Profile类，用于定义系统中所有对象之间的映射关系
    /// </summary>
    public class MESMapping : Profile
    {
        /// <summary>
        /// 构造函数，在其中定义所有映射配置
        /// </summary>
        public MESMapping()
        {
            // 车间管理映射配置
            // 创建shop_management实体与AddCheJianCommand命令之间的双向映射
            CreateMap<shop_management, AddCheJianCommand>().ReverseMap();
            // 创建UpdateCheJianCommand命令与shop_management实体之间的双向映射
            CreateMap<UpdateCheJianCommand, shop_management>().ReverseMap();

            // 供应商管理映射配置
            // 创建AddSupplierCommand命令与Supplier实体之间的双向映射
            CreateMap<AddSupplierCommand, Supplier>().ReverseMap();
            // 创建UpdateSupplierCommand命令与Supplier实体之间的双向映射
            CreateMap<UpdateSupplierCommand, Supplier>().ReverseMap();

            // 账户相关映射配置
            // 注意：以下代码被注释，未启用
            // CreateMap<Account, UserDTO>().ReverseMap();

            // 工艺相关映射配置
            // 创建AssignattributesOne实体与DtoAssignattributesOne数据传输对象之间的双向映射
            CreateMap<AssignattributesOne, DtoAssignattributesOne>().ReverseMap();
            // 创建Processmaintenance实体与DtoProcessmaintenance数据传输对象之间的双向映射
            CreateMap<Processmaintenance, DtoProcessmaintenance>().ReverseMap();
            // 创建Processroute实体与DtoProcessroute数据传输对象之间的双向映射
            CreateMap<Processroute, DtoProcessroute>().ReverseMap();
            
            // 生成计划映射配置
            // 创建GenerateItems实体与DtoGenerateItems数据传输对象之间的双向映射
            CreateMap<GenerateItems, DtoGenerateItems>().ReverseMap();
            // 创建GenerateplanBasic实体与DtoGenerateplanBasic数据传输对象之间的双向映射
            CreateMap<GenerateplanBasic, DtoGenerateplanBasic>().ReverseMap();

            // 客户管理映射配置
            // 创建client实体与AddCustomerCommand命令之间的双向映射
            CreateMap<client, AddCustomerCommand>().ReverseMap();
            // 创建UpdateCustomerCommand命令与client实体之间的双向映射
            CreateMap<UpdateCustomerCommand, client>().ReverseMap();
            
            // 产线管理映射配置
            // 创建Production_line_management实体与AddChanXianCommand命令之间的双向映射
            CreateMap<Production_line_management, AddChanXianCommand>().ReverseMap();
            // 创建UpdateChanXianCommand命令与Production_line_management实体之间的双向映射
            CreateMap<UpdateChanXianCommand, Production_line_management>().ReverseMap();
            
            // 物料群组映射配置
            // 创建Material_group实体与AddMaterialGroupCommand命令之间的双向映射
            CreateMap<Material_group, AddMaterialGroupCommand>().ReverseMap();
            // 创建UpdateMaterialGroupCommand命令与Material_group实体之间的双向映射
            CreateMap<UpdateMaterialGroupCommand, Material_group>().ReverseMap();
            // 创建AccountUpdateCommand命令与Account实体之间的双向映射
            CreateMap<AccountUpdateCommand, Account>().ReverseMap();
                
            // 产品物料映射配置
            // 创建AddProductMaterialCommand命令与Product_material实体之间的双向映射
            CreateMap<AddProductMaterialCommand, Product_material>().ReverseMap();
            // 创建UpdateProductMaterialCommand命令与Product_material实体之间的双向映射
            CreateMap<UpdateProductMaterialCommand, Product_material>().ReverseMap();

            // BOM(物料清单)映射配置
            // 创建AddBOMCommand命令到BOM实体的单向映射
            CreateMap<AddBOMCommand, BOM>();
            // 创建UpdateBOMCommand命令与BOM实体之间的双向映射
            CreateMap<UpdateBOMCommand, BOM>().ReverseMap();

                
            // 仓库相关映射配置
            // 创建AddCangKuCommand命令与CangKuinfo实体之间的双向映射
            CreateMap<AddCangKuCommand, CangKuinfo>().ReverseMap();
            // 创建UpdateCangKuCommand命令与CangKuinfo实体之间的双向映射
            CreateMap<UpdateCangKuCommand, CangKuinfo>().ReverseMap();
            
            // 仓库区域相关映射配置
            // 创建AddCangKuQUCommand命令到CangKuQU实体的单向映射
            CreateMap<AddCangKuQUCommand, CangKuQU>();
            // 创建UpdateCangKuQUCommand命令与CangKuQU实体之间的双向映射
            CreateMap<UpdateCangKuQUCommand, CangKuQU>().ReverseMap();
                
            // 储位相关映射配置
            // 创建AddChuWeiCommand命令与ChuWei实体之间的双向映射
            CreateMap<AddChuWeiCommand, ChuWei>().ReverseMap();
            // 创建UpdateChuWeiCommand命令与ChuWei实体之间的双向映射
            CreateMap<UpdateChuWeiCommand, ChuWei>().ReverseMap();
            
            
            // 仓库分配相关映射配置
            // 创建FenpeiCommand命令与FenpeiCangku实体之间的双向映射
            
            // 成品管理相关映射配置
            // 创建AddGoodCommand命令与Finished_ProductTest实体之间的双向映射
            CreateMap<AddGoodCommand, Finished_ProductTest>().ReverseMap();
            CreateMap<UpdateChukuCommand, Finished_ProductTest>().ReverseMap();
            
            // AI客服相关映射配置
            // 创建AIConversation实体与ConversationHistoryDTO数据传输对象之间的映射
            // 特别配置：当CreateTime为空时使用当前时间作为默认值
            CreateMap<AIConversation, ConversationHistoryDTO>()
                .ForMember(dest => dest.CreateTime, opt => opt.MapFrom(src => src.CreateTime ?? DateTime.Now));
                
            // 创建AIKnowledgeBase实体与KnowledgeResponseDTO数据传输对象之间的映射
            // 特别配置：当CreateTime为空时使用当前时间作为默认值
            CreateMap<AIKnowledgeBase, KnowledgeResponseDTO>()
                .ForMember(dest => dest.CreateTime, opt => opt.MapFrom(src => src.CreateTime ?? DateTime.Now));
        }
    }
}
